package main

import (
	"app/cel"
	"app/conf"
	"app/template"
	"fmt"
	"os"
	"strings"
	"time"
)

type Application struct {
	RunPath           string            // 执行代码时所在目录
	RunBinPath        string            // 可执行代码所在目录
	symbolLeft        string            // 模版变量边界符
	symbolRight       string            // 模版变量边界符
	templateVariables map[string]string // 模版变量
}

var app Application
var templatedDir = ".ctt"

func main() {

	// 处理输入参数
	args := GetArgsOptions()

	// 初始化模版
	t := template.Initialize()

	// 模版路径
	t.Path = app.RunPath + "/" + templatedDir + "/templates/" + args.UseTemplate

	// 模版变量边界符号
	t.SymbolLeft = app.symbolLeft
	t.SymbolRight = app.symbolRight

	// 检查模版目录
	if err := t.Check(); err != nil {
		fmt.Println("[错误]", err.Error())
		return
	}

	// 处理模版变量
	env := cel.NewEnv()
	for varkey, variable := range app.templateVariables {
		varVal := variable

		prg, e := env.Compile(variable)
		if e == nil {
			out, _, e := prg.Eval(map[string]any{"name": args.Name})
			if e == nil {
				varVal, _ = out.Value().(string)
				t.SetEnv(varkey, strings.Trim(varVal, " "))
			}
		}
	}

	// 处理模版
	fmt.Printf(">>>>>>>>> %s <<<<<<<<<\n", time.Now().Format(time.DateTime))
	fmt.Printf("模版解析已完成.\n")
	fmt.Printf("开始处理任务.\n")
	t.Grow()
}

func init() {

	printLogo()

	// 获取环境信息
	app.RunBinPath = os.Args[0]
	app.RunPath, _ = os.Getwd()

	// 读取配置文件
	conf.LoadFile("conf.yaml")

	// 解析变量
	app.templateVariables = make(map[string]string)
	conf.UnmarshalKey("variables", &app.templateVariables)
	conf.UnmarshalKeyDefault("symbol.left", &app.symbolLeft, "{{")
	conf.UnmarshalKeyDefault("symbol.right", &app.symbolRight, "}}")

	// fmt.Printf("%+v\n", app)
}
